
// pages/cart/cart.js
// 1.获取用户的收获地址
//   1.绑定点击事件
//   2.调用小程序内置 api 获取用户的收货地址 wx.chooseAddress

  // 2.获取 用户 对小程序 所授予 获取地址的 权限 scope
    // 1.假设 用户 点击获取收获地址的提示框 确定 authSetting scope.address
      // scope 值 true 直接调用 获取收货地址
    // 2.假设 用户 从来没调用过 收货地址的api
      // scope 值 undefined 直接调用 获取收货地址
    // 3.假设 用户 点击获取收货地址的提示框 取消
      // scope 值 false
        // 1.诱导用户 自己打开 授权设置页面(wx.openSetting) 当用户重新给与 获取收货地址权时限
        // 2.获取收货地址
    // 4.把获取到的收货地址 存入到本地存储中
// 2.页面加载页面完毕
  // 0.onLoad onShow
//   1.获取本地存储中的地址数据
//   2.把数据 设置给data中的一个变量
// 3.onShow
  // 0.回到了商品详情页面 第一次添加商品的时候 手动添加属性
      // 1.num=1;
      // 2.checked=true;
//   1.获取缓存中的购物车数组
//   2.把购物车数据 填充到data中

// 4.全选的实现 数据的展示
//   1.onShow 获取缓存中购物车数组
//   2.根据购物车中的商品数据 所有的商品都被选中 checked=true 

// 5.总价格和总数量
//   1.都需要商品被选中 才拿它计算
//   2.获取缓存中购物车数组
//   3.遍历
//   4.判断商品是否被选中
//   5.总价格 += 商品的单价 * 商品的数量
//   5.总数量 += 商品的数量
//   6.把计算后的价格和数量 设置回data中
// 6.商品的选中
//   1.绑定change事件
//   2.获取到被修改的商品对象
//   3.商品对象的选中状态 取反
//   4.重新填充回data中和缓存中
//   5.重新计算全选 总价格 总数量
// 7.全选和反选
  // 1.全选复选框绑定事件 change
  // 2.获取udata 中的全选变量 allchecked
  // 3.直接取反 allchecked=!allchecked
  // 4.遍历购物车数组 让里面 商品 选中状态跟随 allchecked 改变而改变
  // 5.吧购物车数组 和 allchecked 重新设置回data 和设置回缓存中
// 8.商品数量的编辑
//   1."+" "-" 按钮 绑定同一个点击事件 区分关键 自定义属性
//     1."+"  "+1"
//     2."-"  "-1"
//   2.传递被点击的商品id goods_id
//   3.获取data中的购物车数组 来获取需要被修改的商品对象
//   4.直接修改商品对象的数量 num
  // 4.当 购物车的数量 =1 同时 用户 点击"-"
  //   弹窗提示 询问用户 是否删除
  //   1.确定 直接执行删除
  //   2.取消 什么都不做
//   5.把cart数组 重新设置回缓存中 和data中 this.setCart
// 9.点击结算
  // 1.判断有没有收货地址信息
  // 2.判断用户有没有选购商品
  // 3.经过以上的验证 跳转到 支付页面

// 使用es7，需用导入一下两个文件        
import { getSetting, chooseAddress, openSetting, showModal, showToast } from "../../utils/asyncWx.js";
import regeneratorRuntime from '../../lib/runtime/runtime';
Page({

  /**
   * 页面的初始数据
   */
  data: {
    address:{},
    cart:[],
    allchecked:false,
    sumPrice:0,
    sumNum:0
  },
  onShow: function () {
    // 1.获取本地存储中的地址数据
    const address = wx.getStorageSync("address");
    // 1.获取缓存中的购物车数据
    const cart = wx.getStorageSync("cart")||[];
    this.setData({address});
    this.setCart(cart);
    // console.log(this.data.address);
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

  },
  //1. 点击收获按钮，触发事件
  // getAddress(){
  //   console.log("地址哪呢？我去找你");
  //   // 1.获取 权限转态
  //   wx.getSetting({
  //     success: (result)=>{
  //       // 2.获取权限状态 若是发现一些怪异的属性名 需用 [] 形式获取属性
  //       const scopeAddress = result.authSetting["scope.address"];
  //       if(scopeAddress===true || scopeAddress===undefined){
  //         wx.chooseAddress({
  //           success: (result1)=>{
  //             // console.log(result1);
  //             let address = result1;
  //             wx.setStorageSync("address", address);
  //           },
  //         });
  //       }else{
  //         // 3.用户 以前拒绝过授予权限 先诱导用户打开授权页面
  //         wx.openSetting({
  //           success: (result2)=>{
  //             // 4.可以调用 收货地址代码
  //             wx.chooseAddress({
  //               success: (result3)=>{
  //                 // console.log(result3);
  //                 let address = result3;
  //                 wx.setStorageSync("address", address);
  //               },
  //             });
  //           },
  //         });
  //       }
  //     },
  //   });
  // },
  // es7优化后代码：
  async getAddress() {
    try {
      // 1 获取 权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      // 2 判断 权限状态
      if (scopeAddress === false) {
        await openSetting();
      }
      // 4 调用获取收货地址的 api
      let address = await chooseAddress();
      // address.all = address.provinceName + address.cityName + address.countyName + address.detailInfo;

      // 5 存入到缓存中
      wx.setStorageSync("address", address);

    } catch (error) {
      console.log(error);
    }
  },
  // 商品选中状态
  numChange(e){
    // 获取被修改的商品id
    const goods_id = e.currentTarget.dataset.id;
    // 2.获取购物车数组
    let {cart} = this.data;
    // 3.找到被修改的商品对象
    // findIndex() 函数也是查找目标元素，找到就返回元素的位置，找不到就返回-1。
    let index=cart.findIndex(e=>e.goods_id===goods_id);
    // 4.选中状态取反
    cart[index].checked = !cart[index].checked;
    // 5.6把购物车数据重新设置回data中和缓存中
    this.setCart(cart);
  },
  // 设置购物车状态同时重新计算 底部工具栏的数据 全选 总价格 购买数量
  setCart(cart){
    let allchecked=true;
    // 总价格 总数量
    let sumPrice=0;
    let sumNum=0;
    cart.forEach(e => {
      if(e.checked){
        sumPrice+=e.num*e.goods_price;
        sumNum+=e.num;
      }else{
        allchecked=false;
      }
    });
    // 判断数组是否为空
    allchecked = cart.length!=0?allchecked:false;
    this.setData({
      cart,sumPrice,sumNum,allchecked
    });
    wx.setStorageSync("cart", cart);
  },
  // 商品全选
  allCheChange(){
    // 1.获取data中的数据
    let {cart,allchecked} = this.data;
    // 2.修改值
    allchecked=!allchecked;
    // 3.循环cart数组中的商品选中状态
    cart.forEach(e=>e.checked=allchecked);
    // 4.修改后的值，填充回data或者缓存中
    this.setCart(cart);
  },
  // 商品数量的编辑功能
  async changeNum(e){
    // 1.获取传递过来的参数
    // console.log(e);
    const {operation,id} = e.currentTarget.dataset;
    // 2.获取购物车数组
    let {cart} = this.data;
    // 3.找到需要修改的商品的索引
    const index = cart.findIndex(e=>e.goods_id===id);
    // 4.判断是否要执行删除
    if(cart[index].num===1 && operation===-1){
      // 提示弹窗
      // wx.showModal({
      //   title: '提示',
      //   content: '您是否要删除该商品',
      //   success :(res)=> {
      //     if (res.confirm) {
      //       cart.splice(index,1);
      //       this.setCart(cart)
      //     } else if (res.cancel) {
      //       console.log('用户点击取消')
      //     }
      //   }
      // })
      // es7优化后代码：
      const res = await showModal({content:'您是否要删除该商品'});
      if (res.confirm) {
        cart.splice(index,1);
        this.setCart(cart)
      }
    }else{
      // 4.进行修改数量
      cart[index].num+=operation;
    }
    // 5.设置回缓存和data中
    this.setCart(cart);
  },
  // 点击 结算
  async clickPay(){
    // 1.判断有没有收货地址
    const {address,sumNum} = this.data;
    if(!address.userName){
      await showToast({title:'您没有选择收货地址'});
      return;
    }
    // 2.判断用户有没有选购商品
    if(sumNum===0){
      await showToast({title:'您还没有选购商品'});
      return;
    }
    // 3.跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/pay',
    });
  }
})